package com.lvy.hczn.transmit.domain.dto.cteck;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.apache.commons.lang.StringUtils;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Set;

/**
 * 订单信息
 *
 * @author YinHuaWei
 */
@Data
public class MasterOrderInfo implements Serializable {

    private static final long serialVersionUID = -2708420925730048928L;

    /**
     * 门店编码
     */
    private String storeCode;
    /**
     * 时间长度（1天，10天,30天）
     */
    private Integer dateTimeLong;

    /**
     * 0查询（已确认，已支付），1（不根据状态查）,2查询（已确认，已完成, 不等于未付款）
     */
    private transient int flag;

    /**
     * 退单状态 1无退单,2部分退单,3全部退单
     */
    private Integer returnStatus;

    /**
     * 主订单编号，唯一键
     */
    private String masterOrderSn;

    /**
     * 交易类型 1：款到发货 2：货到付款 3：担保交易
     */
    private Integer transType;

    /**
     * 订单类型 0，正常订单 1，补发订单  2，换货订单
     */
    private Integer orderType;

    /**
     * 换货单关联的原订单号
     */
    private String relatingOriginalSn;

    /**
     * 换货单关联退单编号
     */
    private String relatingReturnSn;

    /**
     * 换货单关联退款单号
     */
    private String relatingRemoneySn;

    /**
     * 用户ID，关联user_users表的user_id
     */
    private String userId;

    private String likeUserId;

    /**
     * 用户名
     */
    private String userName;

    private String goodsSn;

    private String customCode;

    /**
     * 订单状态 0，未确认；1，已确认；2，已取消；3，完成
     */
    private Integer orderStatus;

    /**
     * 订单已完成
     */
    public static final int ORDER_STATUS_COMPLETE = 3;

    /**
     * 支付总状态 0，未付款；1，部分付款；2，已付款；3，已结算）
     */
    private Integer payStatus;

    /**
     * 发货总状态 0，未发货；1，备货中；2，部分发货；3，已发货；4，部分收货；5，客户已收货）
     */
    private Integer shipStatus;

    /**
     * 订单锁定状态（0，未锁定；1，已锁定）
     */
    private Integer lockStatus;

    /**
     * 问题单状态 （0 否  1 是）
     */
    private Integer questionStatus;

    /**
     * 通知收款状态 （0 否  1 是）
     */
    private Integer noticeStatus;

    /**
     * 拆单状态 0：未拆单；1：拆单中；2：已拆单；3：重新拆单
     */
    private Integer splitStatus;

    /**
     * 拆单时间
     */
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
    private Date splitTime;

    /**
     * 订单来源
     */
    private String orderFrom;

    /**
     * 订单生成时间
     */
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
    private Date addTime;

    /**
     * 订单确认时间
     */
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
    private Date confirmTime;

    /**
     * 订单完成时间
     */
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
    private Date finishTime;

    /**
     * 订单结算时间
     */
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
    private Date clearTime;

    /**
     * 设为问题单时间
     */
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
    private Date questionTime;

    /**
     * 订单锁定时间
     */
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
    private Date lockTime;

    /**
     * 订单最后更新时间
     */
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
    private Date updateTime;

    /**
     * 通知收款时间
     */
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
    private Date noticeTime;

    /**
     * 外部交易号
     */
    private String orderOutSn;

    /**
     * 受益人ID，如果开启提成功能
     */
    private Integer beneficiaryId;

    /**
     * 订单由某广告带来的广告id，应该取值于ad
     */
    private Short fromAd;

    /**
     * 参加了哪些促销编号
     */
    private String prIds;

    /**
     * 参加促销的名字(多个)
     */
    private String prName;

    /**
     * 订单的来源媒体
     */
    private String referer;

    /**
     * 缺货处理方式，等待所有商品备齐后再发； 取消订单；与店主协商
     */
    private String howOos;

    /**
     * 能获得推荐分成的用户id，id取值于表users
     */
    private Integer parentId;

    /**
     * 代销类型(0无;1是代销;2是CPS)
     */
    private Integer outletType;

    /**
     * CPS来源
     */
    private String sourceCode;

    /**
     * 配送总费用
     */
    private BigDecimal shippingTotalFee;

    /**
     * 保价总费用
     */
    private Double insureTotalFee;

    /**
     * 支付总费用
     */
    private BigDecimal payTotalFee;

    /**
     * 应付款总金额
     */
    private Double totalPayable;

    /**
     * 商品总金额
     */
    private Double goodsAmount;

    /**
     * 订单总金额
     */
    private BigDecimal totalFee;

    /**
     * 已付款金额
     */
    private BigDecimal moneyPaid;

    /**
     * 订单使用余额
     */
    private BigDecimal surplus;

    /**
     * 使用红包金额
     */
    private Double bonus;

    /**
     * 使用红包ID
     */
    private String bonusId;

    /**
     * 订单商品总数
     */
    private Integer goodsCount;

    /**
     * 订单商品折扣
     */
    private Double discount;

    /**
     * 使用积分金额
     */
    private Double integralMoney;

    /**
     * 使用积分数量
     */
    private Integer integral;

    /**
     * 订单附言，由用户提交订单前填写
     */
    private String postscript;

    /**
     * 商家给客户的留言,当该字段有值时可以在订单查询看到
     */
    private String toBuyer;

    /**
     * 取消原因编码
     */
    private String cancelCode;

    /**
     * 取消原因描述
     */
    private String cancelReason;

    /**
     * 订单种类 1：零售 2：物资领用 3：其它出库 4: C2b定制
     */
    private Integer orderCategory;

    /**
     * 单据组织：物资领用时，成本中心编码；其它出库时，承运商编码
     */
    private String invoicesOrganization;

    /**
     * 是否立即下发ERP（0否，1是）default 0（2014-12版本新增）
     */
    private Integer isnow;

    /**
     * 0:未处理;1:POS(全流通);2:云货架(YHJ);3:线上订单(B2C);4:C2M;5:C2B;6:线上订单B2B
     */
    private Integer source;

    /**
     * 0:未占用;1:已占用
     */
    private Integer preeOccupy;

    /**
     * 订单平台渠道
     */
    private String channelCode;

    /**
     * 订单店铺名称
     */
    private String shopName;

    /**
     * 订单店铺编码
     */
    private String shopCode;

    /**
     * 注册手机号码
     */
    private String registerMobile;

    /**
     * XOMS通知撤单状态 0：不通知  1：通知
     */
    private Integer shipCancelStatus;

    /**
     * 使用点数（1点=1元）
     */
    private Double points;

    /**
     * 订单bv
     */
    private Integer bvValue;

    /**
     * 预计发货日 格式 YYYY-MM-DD
     */
    private String expectedShipDate;

    /**
     * 综合税费
     */
    private Double tax;

    /**
     * 基础bv
     */
    private Integer baseBvValue;

    /**
     * 代下单用户ID
     */
    private String insteadUserId;

    /**
     * 是否需要审核 0不需要、1需要
     */
    private Integer needAudit;

    /**
     * 审单状态 0：未审单、1：已审单
     */
    private Integer auditStatus;

    /**
     * 需要合同签章 0不需要、1需要
     */
    private Integer needSign;

    /**
     * 签章状态 0未签章、1已签章
     */
    private Integer signStatus;

    /**
     * 签章合同号
     */
    private String signContractNum;

    /**
     * 签章完成时间
     */
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
    private Date signCompleteTime;

    /**
     * 收货人地址
     */
    private String address;

    /**
     * 收货人
     */
    private String consignee;

    /**
     * 收货人手机
     */
    private String mobile;

    /**
     * 省
     */
    private String province;

    /**
     * 市
     */
    private String city;

    /**
     * 区
     */
    private String district;

    /**
     * 街道
     */
    private String street;

    private String deliveryTime;

    private String startTime;

    private String endTime;

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
    private Date endTimeDate;

    /**
     * 团购活动id
     */
    private Integer groupBuyId;

    /**
     * 分销金额
     */
    private BigDecimal marketingAmount;

    /**
     * 订单商品明细
     */
    private List<MasterOrderGoods> goodsList;

    /**
     * 订单总金额
     */
    private BigDecimal totalOrderMoney;

    /**
     * 订单总营销金额
     */
    private BigDecimal totalMarketingAmount;

    /**
     * 订单总数
     */
    private BigDecimal totalOrder;

    /**
     * 总营销余额支付金额
     */
    private BigDecimal totalSurplus;

    /**
     * 退款总金额
     */
    private BigDecimal returnTotalFee;

    /**
     * 退款总佣金金额
     */
    private BigDecimal returnMarketingAmount;

    /**
     * 时间查询标识（1当月，2上个月，3按指定日期，4周，5年）
     */
    private Integer dataFlag;

    /**
     * 卖方公司名称
     */
    private String saleCompanyName;

    /**
     * 商品总重量
     *
     * @return
     */
    private BigDecimal weightCount;


    /**
     * 卖方id
     */
    private String saleCompanyId;

    /**
     * 结算方式(1锁价2月末定价)
     */
    private String settlementType;

    /**
     * 结票方式(1:一票结、2:两票结)
     */
    private String settlementTicket;

    /**
     * 卖方公司名称
     */
    private String palletMerchant;

    /**
     * 业务销售区域
     */
    private String saleAreaId;

    /**
     * 业务销售区域
     */
    private String saleAreaName;

    /**
     * 协议类型:1平台协议,2客户协议
     */
    private String protocolType;

    /**
     * 客户协议地址
     */
    private String customerAgreementUrl;

    /**
     * 销售bd
     */
    private String saleBd;

    /**
     * 销售区域
     */
    private String priceAreaId;

    /**
     * 销售区域
     */
    private String priceAreaName;

    /**
     * 是否自提 0 否 1 是自提
     */
    private Integer isCac;

    /**
     * 自提id
     */
    private Integer cacId;

    /**
     * 自提开始时间
     */
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
    private Date cacStartTime;

    /**
     * 自提结束时间
     */
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
    private Date cacEndTime;

    /**
     * 自提点名称
     */
    private String cacName;

    /**
     * 自提点联系方式
     */
    private String cacTel;

    /**
     * 时段细分 0 小时 1 半小时  2 天
     */
    private Integer cacTimeInterval;

    /**
     * 收货地址ID
     */
    private Integer addressId;

    /**
     * 客户合同号
     */
    private String customerContractNum;

    /**
     * 板块模块id  6钢铁
     */
    private String plateModelId;

    /**
     * 营销信息
     */
    private String marketingInfo;

    /**
     * 收货人的电子邮件
     */
    private String email;

    /**
     * 收取店铺佣金
     */
    private BigDecimal storeCommissionPrice;
    /**
     * 收取门店佣金
     */
    private BigDecimal commissionPrice;

    /**
     * 平台优惠券金额
     */
    private BigDecimal platformBonus;

    /**
     * 平台优惠券店铺承担金额
     */
    private BigDecimal storePlatformBonus;

    /**
     * 退单号
     */
    private String returnSn;

    /**
     * 退还收取店铺佣金
     */
    private BigDecimal paymentReturn;

    /**
     * 退还收取门店佣金
     */
    private BigDecimal storePaymentReturn;

    /**
     * 分销退还佣金总金额
     */
    private BigDecimal marketingAmountReturn;

    /**
     * 退单时间
     */
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
    private Date addTimeReturn;

    /**
     * 订单编号集合
     */
    private List<String> masterOrderSnList;

    /**
     * 订单状态集合
     */
    private String orderStatusStr;

    /**
     * 订单状态集合带退单状态
     */
    private String orderStatusNewStr;

    /**
     * 赠送的优惠券批次号(多个逗号分隔)
     */
    private String giftCardLn;

    /**
     * 订单类型0为一般订单，1为联采订单、2秒杀订单,3预购订单,5无库存下单订单,6免单活动
     */
    private Integer orderTypeExtend;

    /**
     * 订单推送外部系统状态，0未推送，1已推送,2推送失败,3无需推送
     */
    private Integer pushSupplyChain;

    /**
     * 订单完成标志(0:下单未完成,-1待处理，1:下单完成)
     */
    private Integer orderFinished;

    /**
     * 积分总金额
     */
    private BigDecimal totalIntegralMoney = BigDecimal.ZERO;

    /**
     * 积分总数量
     */
    private Integer totalIntegral = 0;

    /**
     * 发放积分总数量
     */
    private Integer totalPoints = 0;

    /**
     * 积分查询类型 1查询大于0的消费积分、金额数量 2查询大于0的消费积分、发放积分数量
     */
    private Integer integralType;

    /**
     * 会员手机号
     */
    private String userPhone;

    private String likeUserPhone;

    /**
     * 活动id
     */
    private String activeId;

    /**
     * 活动码
     */
    private Set<String> activityCodeSet;

    /**
     * 活动码
     */
    private String activityCode;

    /**
     * 开始时间
     */
    private String startDate;

    /**
     * 结束时间
     */
    private String endDate;

    /**
     * 活动中奖状态(0未中奖,1已中奖)
     */
    private Integer activityLottery;

    /**
     * 三方支付交易单号（微信支付单号、支付宝支付单号）
     */
    private String payNote;

    public String getOrderStatusStr() {
        orderStatusStr = "";
        if (orderStatus != null) {
            //  订单状态 0，未确认；1，已确认；2，已取消；3，完成；
            if (orderStatus == 0) {
                orderStatusStr += "未确认,";
            }
            if (orderStatus == 1) {
                orderStatusStr += "已确认,";
            }
            if (orderStatus == 2) {
                orderStatusStr += "已取消,";
            }
            if (orderStatus == 3) {
                orderStatusStr += "已完成,";
            }
        }
        if (payStatus != null) {
            // 0，未付款；1，部分付款；2，已付款；3，已结算
            if (payStatus == 0) {
                orderStatusStr += "未付款,";
            }
            if (payStatus == 1) {
                orderStatusStr += "部分付款,";
            }
            if (payStatus == 2) {
                orderStatusStr += "已付款,";
            }
            if (payStatus == 3) {
                orderStatusStr += "已结算,";
            }
        }
        if (shipStatus != null) {
            // 0，未发货；1，备货中；2，部分发货；3，已发货；4，部分收货；5，客户已收货
            if (shipStatus == 0) {
                orderStatusStr += "未发货,";
            }
            if (shipStatus == 1) {
                orderStatusStr += "备货中,";
            }
            if (shipStatus == 2) {
                orderStatusStr += "部分发货,";
            }
            if (shipStatus == 3) {
                orderStatusStr += "已发货,";
            }
            if (shipStatus == 4) {
                orderStatusStr += "部分收货,";
            }
            if (shipStatus == 5) {
                orderStatusStr += "客户已收货,";
            }
        }
        if (StringUtils.isNotBlank(orderStatusStr)) {
            orderStatusStr = orderStatusStr.substring(0, orderStatusStr.length() - 1);
        }
        return orderStatusStr;
    }

    public String getOrderStatusNewStr() {
        String orderStatusStr = getOrderStatusStr();
        if (returnStatus != null) {
            if (returnStatus == 1) {
                orderStatusStr += ",无退单";
            }
            if (returnStatus == 2) {
                orderStatusStr += ",部分退单";
            }
            if (returnStatus == 3) {
                orderStatusStr += ",全部退单";
            }
        }
        return orderStatusStr;
    }

    /**
     * 拼团订单id
     */
    private Integer spellOrderId;

    /**
     * 拼团id
     */
    private Integer spellActiveId;

    /**
     * 成团时限（分钟）
     */
    private Integer groupTimeLimit;
    /**
     * 需要团人数
     */
    private Integer needUserNumber;

    /**
     * 拼团时间
     */
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
    private Date groupAddTime;

    /**
     * 店铺/门店打款状态(0未打款、1已打款)
     */
    private Integer settlementAccount;

    /**
     * 用户使用平台优惠券总金额
     */
    private BigDecimal platformCouponsPrice;

    /**
     * 平台应付总金额
     */
    private BigDecimal platformTotalPrice;
}
